package com.kvn.dubbo.generic;


import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.utils.ReferenceConfigCache;
import com.alibaba.dubbo.rpc.service.GenericService;

/**
 * http://www.tuicool.com/articles/yQnyIju
 * 可以使用 xml 配置的方式，或者编程式的方式来调用泛化服务
 * @author wzy  2017年2月20日下午5:22:48
 */
public class GenericTest {

    public static void main(String[] args) {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("dubbo-provider-xml");
        applicationConfig.setQosEnable(false);
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");


        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
        reference.setApplication(applicationConfig);
        reference.setRegistry(registryConfig); // 使用注册中心
//        reference.setUrl("127.0.0.1:20880"); // 点对点直连
        reference.setInterface("com.kvn.dubbo.DemoService"); // 弱类型接口名
        reference.setGeneric(true); // 声明为泛化接口 

        // ReferenceConfig 实例很重，这里使用缓存的方式获取，来代替直接获取：reference.get()
        // http://dubbo.apache.org/zh-cn/docs/user/demos/reference-config-cache.html
        ReferenceConfigCache cache = ReferenceConfigCache.getCache();
        GenericService genericService = cache.get(reference); // 泛化引用

        // 基本类型以及Date,List,Map等不需要转换，直接调用
		Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {"www:generic"});

        // 用Map表示POJO参数，如果返回值为POJO也将自动转成Map
//		Map<String, Object> person = new HashMap<String, Object>(); 
//		person.put("name", "xxx"); 
//		person.put("password", "yyy"); 
//		Object result = genericService.$invoke("findPerson", new String[]{"com.xxx.Person"}, new Object[]{person}); // 如果返回POJO将自动转成Map 

        System.err.println("----------->" + result);
    }

}
